/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * InterfacePeer.java
 *
 * Created on 14/02/2011, 05:37:41 PM
 */

package Interfaz;

import Source.AdvertisementSharedFiles;
import Source.Peer;
import java.awt.Desktop;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ListSelectionModel;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import javazoom.jl.decoder.JavaLayerException;
import org.farng.mp3.MP3File;
import org.farng.mp3.TagException;
import org.farng.mp3.id3.ID3v1;
import javazoom.jl.player.Player;

/**
 *
 * @author Miguel
 */
public class InterfacePeer extends javax.swing.JFrame {

    private Peer peer;

    private JTree arbolCompartidos;

    private JTree arbolDescargas;

    private JList arbolBusqueda;

    private AdvertisementSharedFiles advArchivoSeleccionado;

     private static boolean DEBUG = false;
      
    /** Creates new form InterfacePeer */
    public InterfacePeer(Peer p) {
        initComponents();
        iniciarComponentes();
        iniciarPanelBusqueda();
        peer = p;
    }

    public void iniciarComponentes() {

        //DefaultMutableTreeNode nodoArchivos = new DefaultMutableTreeNode("Archivos");
        DefaultMutableTreeNode nodoArchivosCompartidos = new DefaultMutableTreeNode("Compartidos");
        crearNodosArbolCompartidos(nodoArchivosCompartidos);
        arbolCompartidos = new JTree(nodoArchivosCompartidos);
        arbolCompartidos.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
                System.out.println("Selecciono el " + node);
                valueChanged2(e, arbolCompartidos);
            }
        });
        this.jScrollPaneCompartidos.setViewportView(this.arbolCompartidos);

        DefaultMutableTreeNode nodoArchivosDescargas = new DefaultMutableTreeNode("Descargas");
        crearNodosArbolDescargados(nodoArchivosDescargas);
        arbolDescargas= new JTree(nodoArchivosDescargas);
        arbolDescargas.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
                System.out.println("Selecciono el " + node);
                    valueChanged2(e, arbolDescargas);
            }
        });
        this.jScrollPaneDescargas.setViewportView(this.arbolDescargas);

    }

    public void iniciarPanelBusqueda()
    {
        this.arbolBusqueda = new JList();
        this.arbolBusqueda.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.arbolBusqueda.setBorder(new TitledBorder("Resultados búsqueda"));
        this.arbolBusqueda.addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                JList lista = (JList) e.getSource();
                advArchivoSeleccionado = (AdvertisementSharedFiles) lista.getSelectedValue();
            }
        });
        this.jScrollPaneResultadosdeBusqueda.setViewportView(this.arbolBusqueda);
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        PanelBotones = new javax.swing.JPanel();
        jButtonBuscar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jTextFieldBuscar = new javax.swing.JTextField();
        jRadioButtonPalabraClave = new javax.swing.JRadioButton();
        jRadioButtonNombre = new javax.swing.JRadioButton();
        jButtonCompararArchivos = new javax.swing.JButton();
        jLabelArchivoaComparar = new javax.swing.JLabel();
        LabelArchivoComparar = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        PanelCompartidos = new javax.swing.JPanel();
        jScrollPaneCompartidos = new javax.swing.JScrollPane();
        LabelArchivosCompartidos = new javax.swing.JLabel();
        jButtonCompartirDocumento = new javax.swing.JButton();
        panelDescargas = new javax.swing.JPanel();
        jScrollPaneDescargas = new javax.swing.JScrollPane();
        labelArchivosDescargados = new javax.swing.JLabel();
        jPanelBusquedas = new javax.swing.JPanel();
        jScrollPaneResultadosdeBusqueda = new javax.swing.JScrollPane();
        labelResultadosdeBusqueda = new javax.swing.JLabel();
        jButtonDescargar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("SISTEMAS DISTRIBUIDOS - PROYECTO 1");

        jButtonBuscar.setText("Buscar");
        jButtonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonBuscarActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 12));
        jLabel1.setText("Buscar Archivo : ");

        jTextFieldBuscar.setMaximumSize(new java.awt.Dimension(6, 20));

        jRadioButtonPalabraClave.setText("Palabra Clave");
        jRadioButtonPalabraClave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonPalabraClaveActionPerformed(evt);
            }
        });

        jRadioButtonNombre.setText("Nombre");
        jRadioButtonNombre.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonNombreActionPerformed(evt);
            }
        });

        jButtonCompararArchivos.setText("Comparar Archivos");
        jButtonCompararArchivos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCompararArchivosActionPerformed(evt);
            }
        });

        jLabelArchivoaComparar.setText("Archivo a Comparar:");

        LabelArchivoComparar.setText("Seleccionar primero...");

        jButton1.setText("Guardar Estado");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout PanelBotonesLayout = new javax.swing.GroupLayout(PanelBotones);
        PanelBotones.setLayout(PanelBotonesLayout);
        PanelBotonesLayout.setHorizontalGroup(
            PanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelBotonesLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(PanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(PanelBotonesLayout.createSequentialGroup()
                        .addComponent(jRadioButtonPalabraClave)
                        .addGap(18, 18, 18)
                        .addComponent(jRadioButtonNombre))
                    .addGroup(PanelBotonesLayout.createSequentialGroup()
                        .addComponent(jTextFieldBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 350, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jButtonBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(43, 43, 43)
                        .addGroup(PanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(PanelBotonesLayout.createSequentialGroup()
                                .addComponent(jLabelArchivoaComparar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(LabelArchivoComparar))
                            .addGroup(PanelBotonesLayout.createSequentialGroup()
                                .addComponent(jButtonCompararArchivos)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 160, Short.MAX_VALUE)
                                .addComponent(jButton1))))))
        );
        PanelBotonesLayout.setVerticalGroup(
            PanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, PanelBotonesLayout.createSequentialGroup()
                .addContainerGap(13, Short.MAX_VALUE)
                .addGroup(PanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextFieldBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonCompararArchivos))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(PanelBotonesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jRadioButtonPalabraClave)
                    .addComponent(jRadioButtonNombre)
                    .addComponent(jLabelArchivoaComparar)
                    .addComponent(LabelArchivoComparar))
                .addGap(12, 12, 12))
            .addGroup(PanelBotonesLayout.createSequentialGroup()
                .addComponent(jButton1)
                .addContainerGap(56, Short.MAX_VALUE))
        );

        LabelArchivosCompartidos.setFont(new java.awt.Font("Tahoma", 0, 18));
        LabelArchivosCompartidos.setText("Archivos Compartidos");

        jButtonCompartirDocumento.setText("Compartir Documento");
        jButtonCompartirDocumento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCompartirDocumentoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout PanelCompartidosLayout = new javax.swing.GroupLayout(PanelCompartidos);
        PanelCompartidos.setLayout(PanelCompartidosLayout);
        PanelCompartidosLayout.setHorizontalGroup(
            PanelCompartidosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelCompartidosLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(LabelArchivosCompartidos)
                .addContainerGap(128, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, PanelCompartidosLayout.createSequentialGroup()
                .addContainerGap(117, Short.MAX_VALUE)
                .addComponent(jButtonCompartirDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, PanelCompartidosLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPaneCompartidos, javax.swing.GroupLayout.PREFERRED_SIZE, 289, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        PanelCompartidosLayout.setVerticalGroup(
            PanelCompartidosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelCompartidosLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(LabelArchivosCompartidos)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPaneCompartidos, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButtonCompartirDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        labelArchivosDescargados.setFont(new java.awt.Font("Tahoma", 0, 18));
        labelArchivosDescargados.setText("Archivos Descargados");

        javax.swing.GroupLayout panelDescargasLayout = new javax.swing.GroupLayout(panelDescargas);
        panelDescargas.setLayout(panelDescargasLayout);
        panelDescargasLayout.setHorizontalGroup(
            panelDescargasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDescargasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDescargasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPaneDescargas, javax.swing.GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE)
                    .addComponent(labelArchivosDescargados))
                .addContainerGap())
        );
        panelDescargasLayout.setVerticalGroup(
            panelDescargasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDescargasLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(labelArchivosDescargados)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPaneDescargas, javax.swing.GroupLayout.PREFERRED_SIZE, 279, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(37, Short.MAX_VALUE))
        );

        labelResultadosdeBusqueda.setFont(new java.awt.Font("Tahoma", 0, 18));
        labelResultadosdeBusqueda.setText("Resultados de Busqueda");

        jButtonDescargar.setText("Descargar");
        jButtonDescargar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonDescargarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanelBusquedasLayout = new javax.swing.GroupLayout(jPanelBusquedas);
        jPanelBusquedas.setLayout(jPanelBusquedasLayout);
        jPanelBusquedasLayout.setHorizontalGroup(
            jPanelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelBusquedasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelBusquedasLayout.createSequentialGroup()
                        .addComponent(jScrollPaneResultadosdeBusqueda, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(jPanelBusquedasLayout.createSequentialGroup()
                        .addComponent(labelResultadosdeBusqueda)
                        .addContainerGap(149, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelBusquedasLayout.createSequentialGroup()
                        .addComponent(jButtonDescargar)
                        .addGap(33, 33, 33))))
        );
        jPanelBusquedasLayout.setVerticalGroup(
            jPanelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelBusquedasLayout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addComponent(labelResultadosdeBusqueda)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPaneResultadosdeBusqueda, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButtonDescargar))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(PanelCompartidos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(panelDescargas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jPanelBusquedas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addComponent(PanelBotones, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PanelBotones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(panelDescargas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanelBusquedas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(PanelCompartidos, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonBuscarActionPerformed
        // TODO add your handling code here:
        String Nombre=null;
        
        if (this.jRadioButtonNombre.isSelected() && !this.jRadioButtonPalabraClave.isSelected() && validarCampodeBusqueda())
        {
            try {
                String param= jTextFieldBuscar.getText().trim();
                    peer.buscarArchivos(param,"Nombre", this);
                } catch (IOException ex) {
                    Logger.getLogger(Peer.class.getName()).log(Level.SEVERE, null, ex);
                }
        } 
        else if (!this.jRadioButtonNombre.isSelected() && this.jRadioButtonPalabraClave.isSelected() && validarCampodeBusqueda())
        {
                String[] c=new String[1];
                try {
                    String param= jTextFieldBuscar.getText().trim();
                    peer.buscarArchivos(param, "PalabrasClave", this);
                } catch (IOException ex) {
                    Logger.getLogger(Peer.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        else {
            JOptionPane.showMessageDialog(null, "Selecionar una Opción de Busqueda", "ERROR", JOptionPane.INFORMATION_MESSAGE);
        }

    }//GEN-LAST:event_jButtonBuscarActionPerformed

    private void jButtonCompartirDocumentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCompartirDocumentoActionPerformed
        // TODO add your handling code here:
        FiltroSeleccionArchivos filtro = new FiltroSeleccionArchivos();
        int i = filtro.showOpenDialog(this);
         if (i == JFileChooser.APPROVE_OPTION) {
            try {
                File file = filtro.getSelectedFile();
                String palabrasClave = JOptionPane.showInputDialog("Ingrese 3 palabras separadas por comas(,)\n ejemplo: palabra1,palabra2,palabra3");
                String[] palClave= palabrasClave.split(",");
                peer.compartirFile(file, palClave);
                peer.encriptarAES(file.getName());
                peer.comprimirArchivo(file.getName()+".enc");
                this.iniciarComponentes();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
            }
            }
        
    }//GEN-LAST:event_jButtonCompartirDocumentoActionPerformed

    private void jRadioButtonPalabraClaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonPalabraClaveActionPerformed
        // TODO add your handling code here:
        this.jRadioButtonNombre.setOpaque(false);
        this.jRadioButtonPalabraClave.setOpaque(true);
        this.jRadioButtonNombre.setSelected(false);
        this.jRadioButtonPalabraClave.setSelected(true);
    }//GEN-LAST:event_jRadioButtonPalabraClaveActionPerformed

    private void jRadioButtonNombreActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonNombreActionPerformed
        // TODO add your handling code here:
        this.jRadioButtonNombre.setOpaque(true);
        this.jRadioButtonPalabraClave.setOpaque(false);
        this.jRadioButtonNombre.setSelected(true);
        this.jRadioButtonPalabraClave.setSelected(false);
    }//GEN-LAST:event_jRadioButtonNombreActionPerformed

    private void jButtonCompararArchivosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCompararArchivosActionPerformed
        // TODO add your handling code here:
        FiltroComparacionArchivo filtro = new FiltroComparacionArchivo();
        int i = filtro.showOpenDialog(this);
         if (i == JFileChooser.APPROVE_OPTION) {
           try {
                File file = filtro.getSelectedFile();
                this.LabelArchivoComparar.setText(file.getName());
                peer.buscarArchivos(String.valueOf(file.length()), "Tamano", this);
                //this.iniciarComponentes();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
            }
            }
    }//GEN-LAST:event_jButtonCompararArchivosActionPerformed

    /**
     * action del boton para descargar
     * @param evt
     */
    private void jButtonDescargarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDescargarActionPerformed
        System.out.println(this.arbolBusqueda.getSelectedValue());
        AdvertisementSharedFiles adv;
        adv= (AdvertisementSharedFiles) arbolBusqueda.getSelectedValue();
        this.peer.descargarArchivo(adv.getOSName(), adv.getOStamano(), adv);
        this.iniciarComponentes();
        
    }//GEN-LAST:event_jButtonDescargarActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
         System.out.println("Selecciono Guardar estado");
         this.peer.guardarEstadoNodo();
    }//GEN-LAST:event_jButton1ActionPerformed

    /**
     * crar los nodos iniciales de la carpeta compartida
     * @param top
     */
    private void crearNodosArbolCompartidos(DefaultMutableTreeNode top) {
        File rutaCompartidos = new File("../temp/Compartidos");
        File[] archivosCompartidos = rutaCompartidos.listFiles();

        DefaultMutableTreeNode archivosAudio = new DefaultMutableTreeNode("Audio");
        DefaultMutableTreeNode archivosVideo = new DefaultMutableTreeNode("Video");
        DefaultMutableTreeNode archivosDocumentos = new DefaultMutableTreeNode("Documentos");
        DefaultMutableTreeNode archivosOtros = new DefaultMutableTreeNode("Otros");
        top.add(archivosAudio);
        top.add(archivosVideo);
        top.add(archivosDocumentos);
        top.add(archivosOtros);

        if (archivosCompartidos != null) {
            for (int i = 0; i < archivosCompartidos.length; i++) {
                try {
                    File file = archivosCompartidos[i];
                    String nombreArchivo = file.getName();
                    //System.out.println(file.getCanonicalPath());
                    DefaultMutableTreeNode nodoArchivo = new DefaultMutableTreeNode(new InfoArchivo(nombreArchivo, file.getCanonicalPath(), false));
                    //Filtrar por tipos de archivo
                    // archivos de audio mp3, wav, wma
                    if (!file.isDirectory()) {
                        if (nombreArchivo.endsWith(".mp3") || nombreArchivo.endsWith(".wav") || nombreArchivo.endsWith(".wma")) {
                            archivosAudio.add(nodoArchivo);
                        } // archivos de video mpg, avi, mpeg
                        else if (nombreArchivo.endsWith(".mpg") || nombreArchivo.endsWith(".avi") || nombreArchivo.endsWith(".mpeg")) {
                            archivosVideo.add(nodoArchivo);
                        } //archivos de Tipo Documento pdf, doc, docx, txt
                        else if (nombreArchivo.endsWith(".pdf") || nombreArchivo.endsWith(".doc") || nombreArchivo.endsWith(".docx") || file.getName().endsWith(".txt")) {
                            archivosDocumentos.add(nodoArchivo);
                        } //otros archivos
                        else {
                            archivosOtros.add(nodoArchivo);
                        }
                    }
                } catch (IOException ex) {
                    Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        
    }

    private void crearNodosArbolDescargados(DefaultMutableTreeNode top) {
        File rutaDescargados = new File("../temp/Descargas");
        if (!rutaDescargados.exists()) {
            rutaDescargados.mkdirs();
        }
        File[] archivosDescargados = rutaDescargados.listFiles();
        DefaultMutableTreeNode archivosAudio = new DefaultMutableTreeNode("Audio");
        DefaultMutableTreeNode archivosVideo = new DefaultMutableTreeNode("Video");
        DefaultMutableTreeNode archivosDocumentos = new DefaultMutableTreeNode("Documentos");
        DefaultMutableTreeNode archivosOtros = new DefaultMutableTreeNode("Otros");
        top.add(archivosAudio);
        top.add(archivosVideo);
        top.add(archivosDocumentos);
        top.add(archivosOtros);
        if (archivosDescargados != null) {
            for (int i = 0; i < archivosDescargados.length; i++) {
               
                    File file = archivosDescargados[i];
                    String nombreArchivo = file.getName();
                    InfoArchivo info  =null;
                    if(peer==null||peer.darInfoArchivoDescargado(nombreArchivo)==null)
                        {
                    try {
                        info = new InfoArchivo(nombreArchivo, file.getCanonicalPath(), true);
                    } catch (IOException ex) {
                        Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    }
                         else {
                                info  =peer.darInfoArchivoDescargado(nombreArchivo);
                         }
                    DefaultMutableTreeNode nodoArchivo = new DefaultMutableTreeNode(info);
                    //Filtrar por tipos de archivo
                    // archivos de audio mp3, wav, wma
                    if (!file.isDirectory()) {
                        if (nombreArchivo.endsWith(".mp3") || nombreArchivo.endsWith(".wav") || nombreArchivo.endsWith(".wma")) {
                            archivosAudio.add(nodoArchivo);
                        } // archivos de video mpg, avi, mpeg
                        else if (nombreArchivo.endsWith(".mpg") || nombreArchivo.endsWith(".avi") || nombreArchivo.endsWith(".mpeg")) {
                            archivosVideo.add(nodoArchivo);
                        } //archivos de Tipo Documento pdf, doc, docx, txt
                        else if (nombreArchivo.endsWith(".pdf") || nombreArchivo.endsWith(".doc") || nombreArchivo.endsWith(".docx") || file.getName().endsWith(".txt")) {
                            archivosDocumentos.add(nodoArchivo);
                        } //otros archivos
                        else {
                            archivosOtros.add(nodoArchivo);
                        }
                    }
            }
        }


    }

    public void actualizarListaArchivos(HashMap<String, AdvertisementSharedFiles> list) {
        System.out.println("ACTUALIZANDO");

        ArrayList resultados = new ArrayList();
        //DefaultMutableTreeNode nodoArchivosResultadosBusqueda = new DefaultMutableTreeNode(list);
        //arbolBusqueda= new JTree(nodoArchivosResultadosBusqueda);
        Iterator it = list.entrySet().iterator();

        while (it.hasNext()) {

            Map.Entry e = (Map.Entry)it.next();
            AdvertisementSharedFiles f= (AdvertisementSharedFiles) e.getValue();
            //System.out.println(e.getKey() + " " + e.getValue());
            resultados.add(f);
        }
        this.arbolBusqueda = new JList();
        arbolBusqueda.setListData( resultados.toArray( ) );
        this.jScrollPaneResultadosdeBusqueda.setViewportView(this.arbolBusqueda);
     }
    public void actualizarListaArchivos(ArrayList<AdvertisementSharedFiles> list) {
        this.arbolBusqueda = new JList();
        arbolBusqueda.setListData( list.toArray() );
        this.jScrollPaneResultadosdeBusqueda.setViewportView(this.arbolBusqueda);
     }

    /**
     * valida un dentro del campo de texto si el usuario digito algo antes de buscar.
     */
    public boolean validarCampodeBusqueda()
    {
        if(this.jTextFieldBuscar.getText().equals("")||this.jTextFieldBuscar.getText()==null)
        {
            JOptionPane.showMessageDialog(null, "Digitar valor de Busqueda", "ERROR", JOptionPane.INFORMATION_MESSAGE);
            return false;
        }
        else return true;
    }



     /** Required by TreeSelectionListener interface. */
    public void valueChanged2(TreeSelectionEvent e, JTree tree)  {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

        if (node == null) {
            return;
        }

        Object nodeInfo = node.getUserObject();
        if (node.isLeaf()) {
            InfoArchivo archivo = (InfoArchivo) nodeInfo;
            System.out.println(archivo.rutaArchivo);
            mostrarInformacionArchivoYAbrirArchivo(archivo);

        } else {
            //displayURL();
        }
    }

    private void mostrarInformacionArchivoYAbrirArchivo(InfoArchivo archivo) {
        String inicioNegrilla = "<b>";
        String finNegrilla = "</b>";
        System.out.println(archivo);
        if(archivo.getNombreArchivo().endsWith("enc"))
        {
            peer.DesEncriptarAES(archivo.getNombreArchivo());
        }
        peer.peticionAbrirArchivo(archivo);
        if (DEBUG) {
            System.out.println("Attempted to display a null URL.");
        }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                String clave = null;
                String name= null;
                name = JOptionPane.showInputDialog("Nombre Unico al Peer");
                if(!name.equals("")||name==null)
                {
                    clave= JOptionPane.showInputDialog("Ingrese su clave");
                }

                Peer peer;
                try {
                    peer = new Peer(name, clave);
                    new InterfacePeer(peer).setVisible(true);
                peer.start();
                } catch (NoSuchAlgorithmException ex) {
                    Logger.getLogger(InterfacePeer.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel LabelArchivoComparar;
    private javax.swing.JLabel LabelArchivosCompartidos;
    private javax.swing.JPanel PanelBotones;
    private javax.swing.JPanel PanelCompartidos;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButtonBuscar;
    private javax.swing.JButton jButtonCompararArchivos;
    private javax.swing.JButton jButtonCompartirDocumento;
    private javax.swing.JButton jButtonDescargar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabelArchivoaComparar;
    private javax.swing.JPanel jPanelBusquedas;
    private javax.swing.JRadioButton jRadioButtonNombre;
    private javax.swing.JRadioButton jRadioButtonPalabraClave;
    private javax.swing.JScrollPane jScrollPaneCompartidos;
    private javax.swing.JScrollPane jScrollPaneDescargas;
    private javax.swing.JScrollPane jScrollPaneResultadosdeBusqueda;
    private javax.swing.JTextField jTextFieldBuscar;
    private javax.swing.JLabel labelArchivosDescargados;
    private javax.swing.JLabel labelResultadosdeBusqueda;
    private javax.swing.JPanel panelDescargas;
    // End of variables declaration//GEN-END:variables

    
}
